0 REM FUNCTION KEYS 1 REM COMMODORE 64 VERSION 2 REM 3 REM BY JOHN TANZINI 4 REM AND RON MINDZAK 5 REM 6 REM 7 REM** 8 REM*** VARIABLE LIST 9 REM** 10 REM T = ACTUAL TOP OF MEMORY 15 REM L = TOTAL LENGTH OF ALL STRINGS DEFINED FOR FUNCTION KEYS 20 REM SM = START OF MACHINE LANGUAGE PROGRAM 25 REM SS = START OF STRINGS DEFINED FOR FUNCTION KEYS 30 REM PP = POINTER TO STRING POINTERS 35 REM SP = POINTER TO STRINGS DURING LOADING OF STRINGS 40 REM C = COUNTER TO DETERMINE IF BYTE READ FROM DATA STATEMENT IS A CHECKSUM 45 REM SU = SUM USED TO DETERMINE CHECKSUM 50 REM CH = CHECKSUM READ FROM DATA STATEMENT 55 REM B = BYTE READ FROM DATA STATEMENT 96 REM 97 REM** 98 REM*** CALCULATE TOP OF MEMORY AND RESERVE MEMORY FOR STRINGS 99 REM** 100 T = PEEK(55) + 256*PEEK(56) 110 POKE 56, PEEK(46)+2 120 POKE 52, PEEK(56) 130 PRINT "[147]FUNCTION KEYS":PRINT 196 REM 197 REM** 198 REM*** DEFINE STRINGS AND PRINT THEM OUT 199 REM** 200 DIM F$(12) 210 F$(1) = "LIST " 220 F$(2) = "LOAD"+CHR$(34) 230 F$(3) = "RUN" 240 F$(4) = "SAVE"+CHR$(34)+"@:" 250 F$(5) = "PRINT PEEK( )[157][157][157][157][157][157]" 260 F$(6) = "OPEN 15,8,15,"+CHR$(34) 270 F$(7) = "PRINT FRE(0)" 280 F$(8) = "CLOSE 15" 290 F$(9) = "GOTO " 300 F$(10) = "GOSUB " 310 F$(11) = "RETURN" 320 F$(12) = "POKE " 330 FOR I = 1 TO 12 340 PRINT "F" + RIGHT$(STR$(I),LEN(STR$(I))-1) + " = "; 345 PRINT CHR$(34) + F$(I) + CHR$(34) 350 NEXT I 396 REM 397 REM** 398 REM*** DETERMINE STARTING LOCATIONS FOR STRINGS AND MACHINE LANGUAGE PROGRAM 399 REM** 400 L = 0 410 FOR I = 1 TO 12 420 L = L + LEN(F$(I)) 430 NEXT I 435 IF L > 231 THEN PRINT "STRINGS TOO LONG": GOTO 800 440 SM = T - 132 450 SS = T - L - 156 496 REM 497 REM** 498 REM*** STORE STRINGS AND POINTERS 499 REM** 500 PP = SS: SP = SS + 12 510 FOR I = 1 TO 7 STEP 2: GOSUB 1000: NEXT I 520 FOR I = 2 TO 8 STEP 2: GOSUB 1000: NEXT I 530 FOR I = 9 TO 12: GOSUB 1000: NEXT I 596 REM 597 REM** 598 REM*** LOAD MACHINE LANGUAGE PROGRAM 599 REM** 600 FOR I = SM TO SM+131 610 READ B 611 SU = SU + B 612 C = C + 1 613 IF C<>19 AND I<>(SM+131) THEN 620 614 READ CH 615 IF CH = SU THEN C=0: SU=0: GOTO 620 616 PRINT: PRINT "DATA STATEMENT ERROR" 617 PRINT "IN LINE"; PEEK(63) + 256*PEEK(64) 618 GOTO 800 620 POKE I, B 630 NEXT I 696 REM 697 REM** 698 REM*** SETUP FOR MACHINE LANGUAGE PROGRAM 699 REM** 700 POKE 250, SM/256 710 POKE 249, SM-256*PEEK(250) 715 POKE 248, 76 720 POKE 252, SS/256 730 POKE 251, SS-256*PEEK(252) 740 POKE 649, 9 750 POKE 55, PEEK(251): POKE 56, PEEK(252) 760 POKE 51, PEEK(251): POKE 52, PEEK(252) 761 POKE T-13, PEEK(789) 762 POKE T-14, PEEK(788) 770 SYS 248 780 NEW 796 REM 797 REM** 798 REM*** RESTORE THE ACTUAL TOP OF MEMORY IF AN ERROR OCCORS 799 REM** 800 POKE 56, T/256 810 POKE 55, T - 256*PEEK(56) 820 END 996 REM 997 REM** 998 REM*** SUBROUTINE TO STORE STRINGS FOR F$(I) 999 REM** 1000 POKE PP, SP-SS: PP = PP+1 1005 IF F$(I) = "" THEN 1060 1010 FOR J = 1 TO LEN(F$(I)) 1030 POKE SP, ASC(MID$(F$(I),J,1)) 1040 SP = SP+1 1050 NEXT J 1060 POKE SP, 0 1070 SP = SP + 1 1080 RETURN 8996 REM 8997 REM** 8998 REM*** DATA FOR MACHINE LANGUAGE PROGRAM 8999 REM** 9000 DATA120,165,250,141,21,3,165,249,24,105,21,144,3,238,21,3,141,20,3,1837 9010 DATA88,96,165,198,208,92,165,254,240,91,169,0,133,254,164,253,24,144,56,2794 9020 DATA201,6,240,17,202,201,5,240,12,202,201,4,240,7,169,255,141,128,2,2473 9030 DATA48,58,134,253,162,0,173,141,2,201,1,208,2,162,4,201,2,208,2,1962 9040 DATA162,8,138,24,101,253,205,128,2,240,30,141,128,2,168,177,251,168,162,2488 9050 DATA0,177,251,240,17,157,119,2,200,232,134,198,224,9,208,241,132,253,169,2963 9060 DATA1,133,254,76,49,234,162,3,165,197,201,3,240,187,202,24,144,162,2437